﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "INoElementIdDbObject.h"
#include "IParameterGroupSorter.h"

namespace gcmp
{
    class IDocument;
    class IElement;
    class IParameter;

    typedef std::vector<std::pair<std::wstring, std::vector<OwnerPtr<IParameter>>>> GroupNameParametersArray;

    /// \brief 参数分组行为接口
    class GCMP_MODEL_INTERFACE_EXPORT IElementParameterGroupOverride : public INoElementIdDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementParameterGroupOverride, gcmp::INoElementIdDbObject)

    public:
        /// \brief 生成默认的元素参数分组行为
        /// \param pElement 所属元素
        /// \return 默认的元素参数分组行为
        static OwnerPtr<IElementParameterGroupOverride> CreateNoChangedElementParameterGroup​Override(
            const IElement *pElement);

        /// \brief 生成空的元素（没有所属元素）参数分组行为
        /// \return 空的元素参数分组行为
        static OwnerPtr<IElementParameterGroupOverride> CreateNullElementParameterGroupOverride();

        /// \brief 直接拷贝分组参数到已排序的的分组输出参数
        ///
        /// \param allGroupParameters 参数分组以及顺序(组名，组内参数）
        /// \param allSortedGroupParameters 调整后的参数分组以及顺序
        static void CopyGroupNameParametersArray(const GroupNameParametersArray& allGroupParameters,
            GroupNameParametersArray& allSortedGroupParameters);

        /// \brief 调整参数所在组别、分组的顺序以及参数在组内的顺序
        ///
        /// \param groupParameterUids 参数分组以及顺序(组名，组内所有参数定义的跨文档Uid）
        /// \param sortedGroupParameterUids 调整后的参数分组以及顺序
        virtual void AdjustParameterGroup(const GroupParameterUidsArray& groupParameterUids, GroupParameterUidsArray& sortedGroupParameterUids) const = 0;

        /// \brief 调整参数所在组别、分组的顺序以及参数在组内的顺序
        /// \param allGroupParameters 参数分组以及顺序(组名，组内参数）
        /// \param allSortedGroupParameters 调整后的参数分组以及顺序
        GCMP_OBSOLETE_API(2021/10/01, AdjustParameterGroup(const GroupParameterUidsArray&, GroupParameterUidsArray&)) virtual void AdjustParameterGroup(const GroupNameParametersArray& allGroupParameters, GroupNameParametersArray& allSortedGroupParameters) const = 0;

    };

}// namespace gcmp


